import Excel from 'exceljs';
import fs from 'fs';

// json 文件生成 excel
export function jsonToExcel(data) {
  function formatJSON(data) {
    let result = {};
    // 数据扁平化处理
    function flatData(params) {
      const {obj, parentKey = ''} = params;
      for (let key in obj) {
        if (!obj.hasOwnProperty(key)) return;
        const newKey = parentKey ? `${parentKey}.${key}` : key;
        if (typeof obj[key] === 'object') {
          flatData({obj: obj[key], parentKey: newKey});
        } else {
          result[newKey] = obj[key];
        }
      }
    }
    flatData({obj: data});
    // console.log("格式化数据", result);
    return result;
  }

  const newData = formatJSON(data);
  // 创建一个新的工作簿
  let workbook = new Excel.Workbook();
  // 添加一个工作表
  let excelSheet = workbook.addWorksheet('it词条');
  // 添加表头
  excelSheet.columns = [
    {header: '语言编码', key: 'code', width: 10},
    {header: '词条编码', key: 'key', width: 40},
    {header: '中文', key: 'zh', width: 50},
    {header: '意大利', key: 'it', width: 100},
  ];
  // 设置每列的样式，包括是否换行
  // worksheet.columns.forEach((column) => {
  //   column.eachCell({ includeEmpty: true }, (cell, data) => {
  //     cell.font = { color: { argb: "FFFF0000" } };
  //     cell.alignment = {  wrapText: false };
  //   });
  // });
  for (let key in newData) {
    let obj = {key, zh: newData[key], it: '', code: '3'};
    excelSheet.addRow(obj);
    // console.log("打印值", obj);
  }
  workbook.xlsx.writeFile('public/it.xlsx');
}

// excel 文件生成 json 格式js文件
export async function excelToJson(entryPath, outputPath) {
  console.log('输入路径 =》', entryPath);
  console.log('输出路径 =》', outputPath);

  const workbook = new Excel.Workbook();
  // 从指定路径读取Excel文件
  const dataBook = await workbook.xlsx.readFile(entryPath);
  // 遍历Excel中的每个工作表
  dataBook.eachSheet(async (sheet, index1) => {
    const rowData = [];
    // 遍历每个工作表中的每行数据
    sheet.eachRow((row, index2) => {
      rowData.push({key: row.values[2], value: row.values[3]});
    });
    rowData.shift();

    const obj = rowData.reduce((acc, {key, value}) => {
      const keys = key.split('.');
      keys.reduce((nestedAcc, k, index) => {
        // 如果是最后一个键，设置值
        if (index === keys.length - 1) {
          nestedAcc[k] = `${value}正则匹配JS替换 // ${value}`;
        } else {
          // 如果当前键不存在，创建一个空对象
          if (!nestedAcc[k]) {
            nestedAcc[k] = {};
          }
        }
        return nestedAcc[k]; // 返回当前键的嵌套对象
      }, acc);
      return acc; // 返回累积的对象
    }, {});

    const jsonString = JSON.stringify(obj, null, 2);
    const jsonStringNote = jsonString.replace(/正则匹配JS替换/g, '",');
    // console.log("注释", jsonStringNote);
    fs.writeFile(outputPath, `export default ${jsonStringNote}`, (err) => {
      if (err) {
        console.error('保存报错了 =》', err);
        return;
      }
      console.log('保存成功路径 =》 ', outputPath);
    });
  });
}

// 验证文件夹路径是否存在
export function checkAccess(dirPath) {
  return new Promise((resolve, reject) => {
    fs.access(dirPath, fs.constants.F_OK, (err) => {
      if (!err) {
        console.log('目录已存在，直接执行操作。');
        return resolve(true);
      }
      // 目录不存在，创建目录
      fs.mkdir(dirPath, {recursive: true}, (mkdirErr) => {
        if (!mkdirErr) {
          console.log('目录创建成功，执行操作。');
          return resolve(true);
        }
        console.error('创建失败', mkdirErr);
        return reject(mkdirErr);
      });
    });
  });
}
